/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package lk;

import java.util.GregorianCalendar;

/**
 *
 * @author Carlos
 */
public class Fecha extends GregorianCalendar{
    public int dia, mes, anho, hora;

    public Fecha(){}
    
    public Fecha(int dia, int mes, int anho, int hora){
        this.mes = mes;
        this.anho = anho;
        
        int dias=0;
        if (hora > 24){
            dias = hora/24;
            hora = hora % 24;
        }
        this.hora = hora;
        this.dia=dia+dias;
        
    }
    
    public Fecha( Fecha f , int horas ){
        f = f.anhadirHoras( horas ) ;
        this.anho = f.anho ;
        this.mes = f.mes;
        this.dia = f.dia ;
        this.hora = f.hora ;
    }

    public boolean esMenorQue( Fecha fecha ){
        if( this.anho < fecha.anho ) return true;
        if( this.anho == fecha.anho && this.mes < fecha.mes ) return true ;
        if( this.anho == fecha.anho && this.mes == fecha.mes && this.dia < fecha.dia ) return true;
        if( this.anho == fecha.anho && this.mes == fecha.mes && this.dia == fecha.dia && this.hora < fecha.hora ) return true ;
        return false;
    }
    
    public int restar( Fecha F ){
        int horasI = 0 , horasF = 0 ;
        
        horasI = ( this.anho - 1 ) * 365 * 24 ; // ANHO
        horasF = ( F.anho - 1 ) * 365 * 24 ;
        
        for(int i = 1 ; i < this.mes ; i++) horasI += ( Utils.getDias( i , this.anho ) * 24 ) ; // MES
        for(int i = 1 ; i < F.mes ; i++) horasF += ( Utils.getDias( i , F.anho ) * 24 ) ;
        
        horasI += ( ( this.dia - 1 ) * 24 ) ; // DIA
        horasF += ( ( F.dia - 1 ) * 24 ) ;
        
        horasI += this.hora ; // HORA
        horasF += F.hora ;
        
        return Math.abs( horasI - horasF ) ;
    }
    
    static public int restar(Fecha fechaI, Fecha fechaF){
        int horasI = 0, horasF = 0;
        
        horasI= (fechaI.anho - 1)  * 365;
        horasF= (fechaF.anho - 1)  * 365;
        
        for(int i=1; i < fechaI.mes; i++){
            if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
                    horasI = horasI + 31*24;
            else if(i == 4 || i == 6 || i == 8 || i == 11)
                    horasI = horasI + 30*24;
           else if(i == 2)
               if((fechaI.anho % 4 == 0) && ((fechaI.anho % 100 != 0) || (fechaI.anho % 400 == 0)))
                   horasI = horasI + 29*24;
               else 
                   horasI = horasI + 28*24;  
        }
        
        horasI = horasI + (fechaI.dia-1)*24;
        horasI = horasI + fechaI.hora;
        
        for(int i=1; i < fechaF.mes; i++){
            if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
                    horasF = horasF + 31*24;
            else if(i == 4 || i == 6 || i == 8 || i == 11)
                    horasF = horasF + 30*24;
           else if(i == 2)
               if((fechaF.anho % 4 == 0) && ((fechaF.anho % 100 != 0) || (fechaF.anho % 400 == 0)))
                   horasF = horasF + 29*24;
               else 
                   horasF = horasF + 28*24;  
        }
        
        horasF = horasF + (fechaF.dia-1)*24;
        horasF = horasF + fechaF.hora;
        
        return horasI - horasF;
    }
    
    public Fecha anhadirHoras( int h ){
        Fecha F = (Fecha)this.clone() ;
        if( this.hora + h >= 24 ){
            F = F.agregarDias( 1 ) ;
            F.hora = this.hora + h - 24 ;
        }else
            F.hora = F.hora + h;
        return F ;
    }
    
    public Fecha agregarDias( int n ){
        Fecha F = (Fecha)this.clone() ;
        if( F.dia + 1 > Utils.getDias( F.mes , F.anho ) ){
            F.dia = 1 ;
            if( F.mes + 1 > 12 ){
                F.mes = 1 ;
                F.anho = F.anho + 1 ;
            }else
                F.mes = F.mes + 1 ;
        }else
            F.dia = F.dia + 1 ;
        return F ;
    }

    public Fecha mas1o2Dias(int n){
        int dia2 = this.dia;
        int mes2 = this.mes;
        int anho2 = this.anho;

        dia2 += n;

        if(mes2 == 1 || mes2 == 3 || mes2 == 5 || mes2 == 7 || mes2 == 8 || mes2 == 10 || mes2 == 12){
                if(dia2 > 31){
                    dia2 -= 31;
                    mes2++;
                }
        }
        else if(mes2 == 4 || mes2 == 6 || mes2 == 8 || mes2 == 11){
            if(dia2 > 30){
                dia2 -= 30;
                mes2++;
            }
        }
        else if(mes2 == 2){
            if((anho2 % 4 == 0) && ((anho2 % 100 != 0) || (anho2 % 400 == 0))){
                if(dia2 > 29){
                    dia2 -= 29;
                    mes2++;
                }
            }
            else{
                if(dia2 > 28){
                    dia2 -= 28;
                    mes2++;
                }
            }

        }
        if(mes2 > 12){
            mes2 -= 12;
            anho2++;
        }

        return new Fecha(dia2, mes2, anho2, this.hora);
    }


    public String aString(){
        String mesString,diaString,horaString;
        if (this.mes < 10)
            mesString = '0' + Integer.toString(this.mes);
        else
            mesString = Integer.toString(this.mes);
        if (this.dia < 10)
            diaString = '0' + Integer.toString(this.dia);
        else
            diaString = Integer.toString(this.dia);
        if (this.hora < 10)
            horaString = '0' + Integer.toString(this.hora);
        else
            horaString = Integer.toString(this.hora);

        return diaString + '/' + mesString + '/' + Integer.toString(this.anho) + '-' + horaString;
    }


    
    /*NO USAR AUN*/
    public void sumarTiempo(int anhos, int meses, int dias, int horas){
        this.hora += horas;
        if(this.hora > 24){
            this.hora -= 24;
            this.dia++;
            if(this.mes == 1 || this.mes == 3 || this.mes == 5 || this.mes == 7 || this.mes == 8 || this.mes == 10 || this.mes == 12){
                if(this.dia > 31){
                    this.dia -= 31;
                    this.mes++;
                }
            }
            else if(this.mes == 4 || this.mes == 6 || this.mes == 8 || this.mes == 11){
                if(this.dia > 30){
                    this.dia -= 30;
                    this.mes++;
                }
            }
            else if(this.mes == 2){

            }

            if(this.mes > 12){
                this.mes -= 12;
                this.anho++;
            }
        }
        this.dia += dias;
        if(this.mes == 1 || this.mes == 3 || this.mes == 5 || this.mes == 7 || this.mes == 8 || this.mes == 10 || this.mes == 12){
                if(this.dia > 31){
                    this.dia -= 31;
                    this.mes++;
                }
            }
            else if(this.mes == 4 || this.mes == 6 || this.mes == 8 || this.mes == 11){
                if(this.dia > 30){
                    this.dia -= 30;
                    this.mes++;
                }
            }
            else if(this.mes == 2){

            }

            if(this.mes > 12){
                this.mes -= 12;
                this.anho++;
            }
        this.mes += meses;
        if(this.mes > 12){
                this.mes -= 12;
                this.anho++;
        }
     
        this.anho += anhos;
    }

}